import 'dart:io';
import 'package:eshi/app/CommonFunctions.dart';
import 'package:eshi/app/shi/data/parse/FileParser.dart';
import 'package:eshi/app/utils/DeviceUtil.dart';
import 'package:eshi/main.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:open_filex/open_filex.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

class SystemEvents{
  final Set<Function> onKeyboardOpenedChange={};
}

class System {
  static  String appDocDir="";
  static late String tmpDir;
  static String  deviceId ="";  ////设备号 
  static String  version ="";  //版本号
  static String get dataInfo => "本设备包含数据10条 其中参与共享的有多少3条";  ////设备号 

  static get isPhone => !kIsWeb && (Platform.isAndroid || Platform.isIOS);
  static get context => mainWidgetKey.currentContext!;
  //判断是不是有软键盘开启
  static bool isKeyboardOpened = false;
  static final SystemEvents _events = SystemEvents();
  static void onKeyboardOpenedChange({Function? run,bool isOpen=false}) async{
    if(run ==null){
      isKeyboardOpened = isOpen;
      await Future.delayed(Duration(microseconds: 100));
      // ignore: avoid_function_literals_in_foreach_calls
      _events.onKeyboardOpenedChange.forEach((run) => run() );
    }else{
      _events.onKeyboardOpenedChange.add(run);
    }

  }

  // 检查并请求目录读取权限
  static Future<bool> requestPermission( Permission permission) async {
    // 检查权限状态
    final status = await permission.status;
    if (status.isGranted) {
      return true;
    }

    // 未授权：请求权限
    if (status.isDenied) {
      final result = await permission.request();
      return result.isGranted ;
    }

    // 权限被永久拒绝（用户勾选了"不再询问"）
    if (status.isPermanentlyDenied) {
      return false;
      // 打开应用设置页面让用户手动授权
      //await openAppSettings();
    }
    return false;
  }
  // //判断是否存在硬件键盘 ////还有问题不过发现了 MethodChannel
  // static bool  _hasHardKeyboard = false;
  // static bool get hasHardKeyboard {
  //   // 硬件键盘存在时，viewInsets.bottom 通常为 0（软键盘未弹出），且可通过 keyboardType 判断
  //   // 结合平台：桌面端（Windows/macOS/Linux）默认有硬件键盘，移动端需检测外接情况
  //   if (defaultTargetPlatform == TargetPlatform.windows ||
  //       defaultTargetPlatform == TargetPlatform.macOS ||
  //       defaultTargetPlatform == TargetPlatform.linux) {
  //     return true; // 桌面端默认有硬件键盘
  //   } else if (defaultTargetPlatform == TargetPlatform.android ||
  //       defaultTargetPlatform == TargetPlatform.iOS) {
  //       return !isKeyboardOpened;
  //       // final mediaQueryData = MediaQuery.of(context);
  //       // return mediaQueryData.viewInsets.bottom == 0 &&  _hasHardKeyboard;
  //   }
  //   return false; // 其他平台默认返回 false
  // }

  static void initValues() async{
    appDocDir = (isPhone) ? "${(await getApplicationDocumentsDirectory()).path}/" :"";
    tmpDir = (isPhone) ? "${(await getApplicationCacheDirectory()).path}/" :"/tmp/eshi/";
    // tmpDir = (isPhone) ? "${(await getExternalCacheDirectories())?.first.path}/" :"/tmp/eshi/";
    deviceId =  await DeviceUtil.getDeviceId() ?? "";
    // DeviceUtil.initKeyboardState((v) => _hasHardKeyboard = v );
    version = kIsWeb ? "" : Platform.version;
  }
  static copy(String data) async{
    // 核心：复制内容到剪切板
      await Clipboard.setData(
        ClipboardData(text: data), // text 为要复制的字符串
      );
  }
  static quit(){
     // 判断当前平台
    if (Theme.of(context).platform == TargetPlatform.android) {
      // Android 平台：使用 SystemNavigator 退出
      SystemNavigator.pop();
    } else if (Theme.of(context).platform == TargetPlatform.iOS) {
      // iOS 平台：苹果不推荐主动退出，这里模拟返回桌面（实际项目中慎用）
      // 注意：iOS 审核可能不通过主动退出的行为
      MethodChannel('toy.keli.eshi/exit').invokeMethod('exit');
    }else{
      exit(0);
    }
  }
  
  //分享文件
  static open(String filePath,{bool androidContentEnable=false}) async{
       // 检查文件是否存在
    final file = File(filePath);
    if (!await file.exists()) {
      msgErr("${mt("文件不存在")}：$filePath");
      return; 
    }

    if(Platform.isAndroid && androidContentEnable){
          FileParser.android.openFile(file).then((res)=> print(res) );
          return;
    } 
    // 调用系统默认程序打开文件
    final result = await OpenFilex.open(filePath);

    // 处理打开结果
    switch (result.type) {
      case ResultType.done:
        // 成功打开
        // _showSnackBar("文件已打开");
        break;
      case ResultType.fileNotFound:
        msgErr("文件未找到");
        break;
      case ResultType.noAppToOpen:
        msgErr("没有应用可打开该文件");
        break;
      case ResultType.permissionDenied:
        msgErr("权限不足，无法打开文件");
        break;
      default:
        msgErr("${mt("打开失败")}：${result.message}");
    }
  }

  
}
